package com.tyut.musicdreamer.service.user.controller;

import cn.dev33.satoken.stp.StpUtil;
import com.tyut.musicdreamer.service.user.model.dto.LoginRequest;
import com.tyut.musicdreamer.service.user.model.dto.RegisterRequest;
import com.tyut.musicdreamer.service.user.model.vo.TokenVO;
import com.tyut.musicdreamer.service.user.model.vo.UserVO;
import com.tyut.musicdreamer.service.user.service.UserService;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;

import java.util.HashMap;
import java.util.Map;

/**
 * 认证控制器 - 专门处理用户认证相关功能
 * 
 * 在微服务架构中，认证的职责分配如下：
 * 1. 用户服务：负责用户信息管理、登录认证逻辑
 * 2. 网关服务：负责请求拦截、token校验
 * 
 * 该控制器处理的功能：
 * - 用户注册(/register)：创建新用户
 * - 用户登录(/login)：验证用户凭据
 * - 获取用户信息(/info)：获取指定用户的详细信息
 * - 测试API(/test)：检查服务健康状态
 */
@RestController
@RequestMapping("/api/auth")
@RequiredArgsConstructor
@Slf4j
public class AuthController {

    private final UserService userService;

    /**
     * 用户注册
     *
     * @param request 注册请求
     * @return 注册成功的用户信息
     */
    @PostMapping("/register")
    public UserVO register(@RequestBody @Valid RegisterRequest request) {
        log.info("接收到用户注册请求: {}", request.getUsername());
        return userService.register(request);
    }
    
    /**
     * 用户登录
     *
     * @param request 登录请求
     * @return 登录结果，包含用户信息
     */
    @PostMapping("/login")
    public TokenVO login(@RequestBody @Valid LoginRequest request) {
        log.info("接收到用户登录请求: {}", request.getUsername());
        TokenVO tokenVO = userService.login(request);
        
        // 在用户服务执行 Sa-Token 登录，确保 Redis 中有相同的登录信息
        // 注意: 网关层也会执行登录，所以需要确保使用相同的 Redis 实例
        StpUtil.login(tokenVO.getUserId());
        
        // 获取 token 值，添加到返回结果中
        tokenVO.setToken(StpUtil.getTokenValue());
        
        return tokenVO;
    }

    /**
     * 获取指定用户信息
     * 
     * @param userId 用户ID
     * @return 用户的详细信息（不含敏感数据）
     */
    @GetMapping("/info/{userId}")
    public UserVO getUserInfo(@PathVariable Long userId) {
        log.debug("获取用户信息, 用户ID: {}", userId);
        return userService.getUserInfo(userId);
    }
    
    /**
     * 测试API是否正常工作
     * 用于检查服务健康状态，不需要认证
     * 
     * @return 包含成功状态和时间戳的响应
     */
    @GetMapping("/test")
    public Map<String, Object> test() {
        log.debug("接收到测试请求");
        Map<String, Object> result = new HashMap<>();
        result.put("success", true);
        result.put("message", "API工作正常");
        result.put("timestamp", System.currentTimeMillis());
        return result;
    }
} 